home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Developer Toolbox 6.1
/
SGI Developer Toolbox 6.1 - Disc 4.iso
/
src
/
demos
/
REALITY
/
distort
/
imagedata.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-01
|
4KB
|
149 lines
/*
* Copyright 1993, 1994, Silicon Graphics, Inc.
* All Rights Reserved.
*
* This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
* the contents of this file may not be disclosed to third parties, copied or
* duplicated in any form, in whole or in part, without the prior written
* permission of Silicon Graphics, Inc.
*
* RESTRICTED RIGHTS LEGEND:
* Use, duplication or disclosure by the Government is subject to restrictions
* as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
* and Computer Software clause at DFARS 252.227-7013, and/or in similar or
* successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
* rights reserved under the Copyright Laws of the United States.
*/
/*
imagedata.c
Taken from the 'ipaste.c' source in 4Dgifts.
*/
#include <stdio.h>
#include <gl/image.h>
#include "imagedata.h"
unsigned long *longimagedata(name, width, height)
char *name;
int *width, *height;
{
long *base, *lptr;
short *rbuf, *gbuf, *bbuf, *abuf;
IMAGE *image;
int y;
image = iopen(name,"r");
if(!image)
return NULL;
(*width)=image->xsize;
(*height)=image->ysize;
base = (long *)malloc(image->xsize*image->ysize*sizeof(long));
rbuf = (short *)malloc(image->xsize*sizeof(short));
gbuf = (short *)malloc(image->xsize*sizeof(short));
bbuf = (short *)malloc(image->xsize*sizeof(short));
abuf = (short *)malloc(image->xsize*sizeof(short));
if(!base || !rbuf || !gbuf || !bbuf)
return NULL;
lptr = base;
for(y=0; y<image->ysize; y++) {
if(image->zsize>=4) {
getrow(image,rbuf,y,0);
getrow(image,gbuf,y,1);
getrow(image,bbuf,y,2);
getrow(image,abuf,y,3);
rgbatocpack(rbuf,gbuf,bbuf,abuf,lptr,image->xsize);
lptr += image->xsize;
} else if(image->zsize==3) {
getrow(image,rbuf,y,0);
getrow(image,gbuf,y,1);
getrow(image,bbuf,y,2);
rgbtocpack(rbuf,gbuf,bbuf,lptr,image->xsize);
lptr += image->xsize;
} else {
getrow(image,rbuf,y,0);
bwtocpack(rbuf,lptr,image->xsize);
lptr += image->xsize;
}
}
iclose(image);
free(rbuf);
free(gbuf);
free(bbuf);
free(abuf);
return (unsigned long *) base;
}
bwtocpack(b,l,n)
register unsigned short *b;
register unsigned long *l;
register int n;
{
while(n>=8) {
l[0] = 0x00010101*b[0];
l[1] = 0x00010101*b[1];
l[2] = 0x00010101*b[2];
l[3] = 0x00010101*b[3];
l[4] = 0x00010101*b[4];
l[5] = 0x00010101*b[5];
l[6] = 0x00010101*b[6];
l[7] = 0x00010101*b[7];
l += 8;
b += 8;
n -= 8;
}
while(n--)
*l++ = 0x00010101*(*b++);
}
rgbtocpack(r,g,b,l,n)
register unsigned short *r, *g, *b;
register unsigned long *l;
register int n;
{
while(n>=8) {
l[0] = r[0] | (g[0]<<8) | (b[0]<<16);
l[1] = r[1] | (g[1]<<8) | (b[1]<<16);
l[2] = r[2] | (g[2]<<8) | (b[2]<<16);
l[3] = r[3] | (g[3]<<8) | (b[3]<<16);
l[4] = r[4] | (g[4]<<8) | (b[4]<<16);
l[5] = r[5] | (g[5]<<8) | (b[5]<<16);
l[6] = r[6] | (g[6]<<8) | (b[6]<<16);
l[7] = r[7] | (g[7]<<8) | (b[7]<<16);
l += 8;
r += 8;
g += 8;
b += 8;
n -= 8;
}
while(n--)
*l++ = *r++ | ((*g++)<<8) | ((*b++)<<16);
}
rgbatocpack(r,g,b,a,l,n)
register unsigned short *r, *g, *b, *a;
register unsigned long *l;
register int n;
{
while(n>=8) {
l[0] = r[0] | (g[0]<<8) | (b[0]<<16) | (a[0]<<24);
l[1] = r[1] | (g[1]<<8) | (b[1]<<16) | (a[1]<<24);
l[2] = r[2] | (g[2]<<8) | (b[2]<<16) | (a[2]<<24);
l[3] = r[3] | (g[3]<<8) | (b[3]<<16) | (a[3]<<24);
l[4] = r[4] | (g[4]<<8) | (b[4]<<16) | (a[4]<<24);
l[5] = r[5] | (g[5]<<8) | (b[5]<<16) | (a[5]<<24);
l[6] = r[6] | (g[6]<<8) | (b[6]<<16) | (a[6]<<24);
l[7] = r[7] | (g[7]<<8) | (b[7]<<16) | (a[7]<<24);
l += 8;
r += 8;
g += 8;
b += 8;
a += 8;
n -= 8;
}
while(n--)
*l++ = *r++ | ((*g++)<<8) | ((*b++)<<16) | ((*a++)<<24);
}